package com.invernadero.invernaderotesis.Acceso_a_datos.DAOS;

import java.util.Calendar;
import java.util.Date;

import android.annotation.TargetApi;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Build;

import com.invernadero.invernaderotesis.Acceso_a_datos.FabricaDAO.FabricaDAO;
import com.invernadero.invernaderotesis.Acceso_a_datos.iDAOS.iDAOCliente;
import com.invernadero.invernaderotesis.Acceso_a_datos.iDAOS.iDAOInvernadero;
import com.invernadero.invernaderotesis.Modelo.Elementos.Conversion;
import com.invernadero.invernaderotesis.Modelo.Entidades.*;
import com.invernadero.invernaderotesis.Modelo.Fabricas.FabricaElemento;
import com.invernadero.invernaderotesis.Modelo.Fabricas.FabricaEntidad;


public class DAOCliente extends DAO implements iDAOCliente {

	private Cliente cliente;
	
	public DAOCliente(Context context){
		super();
		
		this.setContext(context);
	}
	
	/*
	 * Getters & setters
	 */
	public Cliente getCliente() {
		return cliente;
	}


	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}


	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public Boolean insertarCliente(Entidad cliente){
		
		Boolean result    = false;
		Boolean resultInv = false;
		// si un registro no se ha insertado, retorna -1
		Long idInsertado = (long) -1;
		
		//IniciarSecuencia();
		
		/*Invernadero invernadero1 = (Invernadero)FabricaEntidad.CrearInvernadero();
		invernadero1.set_id(1);
		invernadero1.set_nombre("invernadero kleyt");
		invernadero1.set_descripcion("El mejor invernadero");

		Date fecha = new Date(); 
    	final Calendar calendar = Calendar.getInstance();
    	fecha.setDate(calendar.get(Calendar.DAY_OF_MONTH));
    	fecha.setMonth(calendar.get(Calendar.MONTH));
    	fecha.setYear(calendar.get(Calendar.YEAR));
        fecha.setHours(calendar.get(Calendar.HOUR));
        fecha.setMinutes(calendar.get(Calendar.MINUTE));
        
		((Cliente)cliente).set_id(1);
		((Cliente)cliente).set_nombre("Kleyvert");
		((Cliente)cliente).set_apellido("Martinez");
		((Cliente)cliente).set_celular("0412-6177102");
		((Cliente)cliente).set_contrasena("123");
		((Cliente)cliente).set_usuario("Kleyt");
		((Cliente)cliente).set_correo("Kleytmaster@gmail.com");
		((Cliente)cliente).set_fechaNacmiento(fecha);
		((Cliente)cliente).setInvernadero(invernadero1);*/
		
		this.setCliente((Cliente)cliente);
		
		SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());
		
		try{
			// Crea una instancia de tipo "ContentValues" que representa un registro de la BD
			// y es al que se de deben asignar los valores a insertar
			ContentValues registro = CrearRegistroCliente();
						
			// Inserta el registro
			idInsertado = bd.insert("Persona", null, registro);
			result      = (idInsertado != (long) -1);
			// verificamos que el resultado sea distinto a -1
			if (idInsertado != -1){
				// creamos una instancia del tipo DAOInvernadero
	            iDAOInvernadero invernadero = FabricaDAO.CrearDAOInvernadero(this.getContext());
	            // insertamos el invernadero pasando por parametro el "id" del cliente registrado
	            resultInv = invernadero.InsertarInvernadero(this.getCliente().getInvernadero(),Integer.valueOf(idInsertado.toString()));
	            
	            return resultInv;
			}
		}catch(SQLiteException e){
			
			  throw new SQLiteException("error al insertar el registro del cliente o invernadero");
			  
		}finally{
			
			bd.close();
			//EliminarTemperatura(idinvernadero);
		}
		
		return result;
	}
	
	/**
	 * Consultamos el cliente
	 */
	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public Entidad consultarCliente(Entidad cliente){
		
		Boolean result = true;

		//insertarCliente(cliente);
		this.setCliente((Cliente)cliente); // seteamos el atributo del tipo cliente
		//insertarCliente(cliente);
		SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());
		
		try{
			// Armamos el "Query" 
			String sql = this.getConsultaCliente();
			sql        = this.ObtenerConsultaCliente(sql,this.getCliente());
			
			// Ejecuta la consulta y re recibe en una variable de tipo "Cursor" para recorrer los resultados
			Cursor fila = bd.rawQuery(sql, null);
			// fila.moveToFirst(): retorna true (1) en caso que exista al menos un registro
			// retorna false (0) si no existen registros
			// Muestra el resultado de la consulta
			if (fila.moveToFirst() == true)
			{		
				// seteamos las consultadas
				SetVariablesCliente(fila);
				
			}else{
				
				// si el query no trae nada es por que la fecha excedio el limite de 3 min
				result = false;
			}
			
		}catch(SQLiteException e){
			
			throw new SQLiteException("error al consultar el registro");
			
		}finally{
			
			bd.close();
		
		}
		
		if (result)
		    return (this.getCliente());
		else{
			return null;
		}
	}

	/**
	 * Modificamos un cliente en la BD
	 */
    public Boolean ModificarCliente(Entidad cliente){

        Boolean result = true;

        int cant = 0; // Cantidad de registros actualizados
        this.setCliente((Cliente)cliente); // seteamos el atributo del tipo cliente

        SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());

        try{

            // Crea una instancia de tipo "ContentValues" que representa un registro de la BD
            // y es al que se de deben asignar los valores a modificar
         	ContentValues registro = CrearRegistroCliente();

            // Actualiza el registro y retorna la cantidad de filas modificadas								// Id
			cant = bd.update("Persona", registro, "idPersona = " + this.getCliente().get_id() + "", null);
			result = (cant > 0);
			
        }catch(SQLiteException e){

            throw new SQLiteException("error al consultar el registro");

        }finally{

            bd.close();

        }

        if (result)
            return (result);
        else{
            return null;
        }
        
    } // ModificarCliente
    
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public void IniciarSecuencia() {
		Boolean result = false;

		// si un registro no se ha insertado, retorna -1
		//Long idInsertado = (long) -1;
		int cant = 0; // Cantidad de registros actualizados

		// Accede a la BD y le pone por nombre "BdTerrae"
		SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());

		try
		{
			String Variable = "";
			cant = bd.delete("VariableInver", null, null);
			cant = bd.delete("TanqueInver", null, null);
			cant = bd.delete("PlantaInver", null, null);
			cant = bd.delete("Variable", null, null);
			cant = bd.delete("Tanque", null, null);
			cant = bd.delete("Planta", null, null);
			cant = bd.delete("Timer", null, null);
			cant = bd.delete("Invernadero", null, null);
			cant = bd.delete("Persona", null, null);
			Variable = "Variable";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Tanque";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Planta";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Timer";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Invernadero";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Persona";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			result = (cant > 0);
		} catch (Exception e)
		{
			result = false;
			// 
		}
		finally
		{
			bd.close();
		}		
		
	} // IniciarSecuencia
    
	/**
	 * Seteamos el objeto del tipo cliente con los resultados en el Cursor
	 * @param fila
	 */
	private void SetVariablesCliente(Cursor fila){
		
		Conversion conversion = FabricaElemento.CrearConversion();
		Invernadero invernadero = (Invernadero)FabricaEntidad.CrearInvernadero();
        
        this.getCliente().set_id(fila.getInt(0));
		this.getCliente().set_nombre(fila.getString(1));
		this.getCliente().set_apellido(fila.getString(2));
		this.getCliente().set_fechaNacmiento(conversion.ConvertirFecha(fila.getString(3)));
		this.getCliente().set_correo(fila.getString(4));
		this.getCliente().set_contrasena(fila.getString(5));
		this.getCliente().set_usuario(fila.getString(6));
			 invernadero.set_nombre(fila.getString(7));
			 invernadero.set_id(fila.getInt(8));
			 invernadero.set_descripcion(fila.getString(9));
	    this.getCliente().set_celular(fila.getString(10));
		this.getCliente().setInvernadero(invernadero);
		
		
	} // SetVariablesCliente
	
	private ContentValues CrearRegistroCliente()
	{
		// Crea una instancia de tipo "ContentValues" que representa un registro de la BD
		// y es al que se de deben asignar los valores a insertar
		ContentValues registro = new ContentValues();
		
		Conversion conversion = FabricaElemento.CrearConversion();

		registro.put("nombre", this.getCliente().get_nombre());
		registro.put("apellido", this.getCliente().get_apellido());
		registro.put("fechaNacimiento", conversion.ConvertirFecha(this.getCliente().get_fechaNacmiento()));
		registro.put("correo", this.getCliente().get_correo());
		registro.put("password", this.getCliente().get_contrasena());
		registro.put("usuario", this.getCliente().get_usuario());
		registro.put("celular", this.getCliente().get_celular());
		
		return registro;
	}
}
